package com.nas.crocus.service.impl;

import java.util.ArrayList;
import java.util.Collection;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.nas.crocus.dao.PasajeroDao;
import com.nas.crocus.domain.Evento;
import com.nas.crocus.domain.Pasajero;
import com.nas.crocus.domain.Persona;
import com.nas.crocus.exception.EntidadNoUnicaException;
import com.nas.crocus.exception.PrecondicionNoCumplidaException;
import com.nas.crocus.service.EventoService;
import com.nas.crocus.service.PasajeroService;
import com.nas.crocus.service.PersonaService;

@Service
@Transactional
public class PasajeroServiceImpl implements PasajeroService {

    @Autowired
    private EventoService eventoService;
    
    @Autowired
    private PersonaService personaService;
    
    @Autowired
    private PasajeroDao pasajeroDao;
    
    @Override
    public Collection<Pasajero> buscarPorEventoId(Long eventoId) {
        return pasajeroDao.buscarPorEventoId(eventoId);
        
    }

    @Override
    public Pasajero buscar(Long pasajeroId) {
        
        return pasajeroDao.buscar(pasajeroId);
    }
    @Override
    public Collection<Pasajero> buscarMiembroPorPatronApellidoNombreNumeroDocumento(
            String patron) {
        Collection<Pasajero> resultado = null;
        ArrayList<Pasajero> resultadoFiltrado = new ArrayList<Pasajero>();
        try {
            Integer numeroDoc = Integer.parseInt(patron);
            resultado = pasajeroDao.buscarPorPatronNumeroDocumento(numeroDoc); 
            
        } catch (NumberFormatException nfe){
            resultado = pasajeroDao.buscarPorPatronApellidoNombre(patron);
        }
        for (Pasajero pasajero : resultado) {
            if (pasajero.getAcompanianteDe() == null) {
                resultadoFiltrado.add(pasajero);
            }
        }
        
        return resultadoFiltrado;
    }

    @Override
    public void guardar(Pasajero pasajero) throws EntidadNoUnicaException, PrecondicionNoCumplidaException {
        Pasajero pasajeroExistente = pasajeroDao.obtenerPorClaveCompuesta(pasajero.getRegistroPasajero().getId(), pasajero.getPersona().getId());
        
        if (pasajeroExistente != null) {
            throw new EntidadNoUnicaException("Ya se encuentra registrado en el evento");
        }
        
        Pasajero acompanianteDe = pasajero.getAcompanianteDe();
        if (acompanianteDe.getId() == null) {
            pasajero.setAcompanianteDe(null);
        } else {
            Pasajero acompanianteDeRegistrado = pasajeroDao.buscar(acompanianteDe.getId());
            if (acompanianteDeRegistrado.getAcompanianteDe() != null) {
                throw new PrecondicionNoCumplidaException("No se puede asignar un acompañante a otro acompañante");
            }
            pasajero.setAcompanianteDe(acompanianteDeRegistrado);
        }
        
        pasajeroDao.guardar(pasajero);
    }

    @Override
    public void actualizar(Pasajero pasajero) throws EntidadNoUnicaException, PrecondicionNoCumplidaException {
        
        Pasajero pasajeroActualizar = pasajeroDao.buscar(pasajero.getId());
        if (pasajeroActualizar.getPersona().getId().longValue() != pasajero.getPersona().getId().longValue()) {
            Pasajero pasajeroExistente = pasajeroDao.obtenerPorClaveCompuesta(pasajero.getRegistroPasajero().getId(), pasajero.getPersona().getId());
            if (pasajeroExistente != null) {
                throw new EntidadNoUnicaException("Ya se encuentra registrado en el evento");
            }
            pasajeroActualizar.setPersona(pasajero.getPersona());
        }
        Pasajero acompanianteDe = pasajero.getAcompanianteDe();
        if (acompanianteDe.getId() == null) {
            pasajeroActualizar.setAcompanianteDe(null);
        } else {
            if (acompanianteDe.getId().longValue() == pasajero.getId().longValue()) {
                throw new PrecondicionNoCumplidaException("No se puede asignar a si mismo como acompañante");
            }
            Pasajero acompanianteDeRegistrado = pasajeroDao.buscar(acompanianteDe.getId());
            if (acompanianteDeRegistrado.getAcompanianteDe() != null) {
                throw new PrecondicionNoCumplidaException("No se puede asignar un acompañante a otro acompañante");
            }
            pasajeroActualizar.setAcompanianteDe(acompanianteDeRegistrado);
        }
        pasajeroActualizar.setObservacion(pasajero.getObservacion());
        pasajeroDao.actualizar(pasajeroActualizar);
        
    }

    @Override
    public Collection<Pasajero> buscarAcompaniantesPorPasajeroId(Long pasajeroId) {        
        Pasajero pasajero = pasajeroDao.buscar(pasajeroId);
        ArrayList<Pasajero> acompaniantes = new ArrayList<Pasajero>();
        
        for (Pasajero acompaniante : pasajero.getAcompaniantes()) {
            acompaniantes.add(acompaniante);
        }
        return acompaniantes;
    }
    
    
}
